package com.gkey.demo.file;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import com.gkey.base.web.BaseController;
import com.gkey.cache.base.DynParameter;
import com.gkey.core.util.CharsTool;
import com.gkey.core.util.FilesUtil;

/**  
 * @Title: 单附件异步上传 .java
 * @Package com.gkey.demo.file
 * @Description: TODO
 * @author GuoKey
 * @date 2016年8月26日 下午5:12:30
 * @version 1.0
 */
@Controller
@RequestMapping(value="/upload2")
public class Upload2Controller extends BaseController  {	
	
	@Autowired
	protected DynParameter dynParameter;
	
	
	/**
	 * 
	 * @Description: 附件上传
	 * @param request
	 * @param response
	 * @param model
	 * @return   
	 * String  
	 * @throws
	 * @author keyGuo
	 * @date 2016年8月29日 下午1:48:12
	 */
	@RequestMapping(value="/uploader",method = RequestMethod.POST)
	public String uploader(HttpServletRequest request,HttpServletResponse response,
			
			@RequestParam(value="upType",required=false) String upType,//上传类型
			@RequestParam(value="upId",required=false) String upId,//上传id
			
			@RequestParam(value="checkSize",required=false) String checkSize,//校验尺寸			
			@RequestParam(value="width",required=false) Long width,//宽
			@RequestParam(value="height",required=false) Long height,//高
			
			@RequestParam(value="checkVolume",required=false) String checkVolume,//校验文件大小Kb、Mb
			@RequestParam(value="volumeSize",required=false) Long volumeSize,//文件大小
			@RequestParam(value="volumeType",required=false) String volumeType,//大小单位			
			
			@RequestParam(value="tickSize",required=false) String tickSize,//反馈尺寸
			
			@RequestParam(value="tickVolume",required=false) String tickVolume,//反馈大小
			
			Model model){
		
		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		
	    CommonsMultipartFile cfile = (CommonsMultipartFile) multipartRequest.getFile(upId);
	    
	    String message = null ;
	    
	    if(!cfile.isEmpty()){
	    	
	    	String fileName = cfile.getFileItem().getName();
	    	
	    	message = checkUpType(fileName, upType);
	    	
	    	if (CharsTool.isNotEmpty(message)) {
	    		
                return uploaderReturn(model, message);
            }	    		    	
	    	
	    	String localPath = dynParameter.getLocalFilePath();//本地保存路径
	    	
	    	//String tempFilePath = dynParameter.getLocalFilePath();//本地临时路径 
	    	
	    	String showFilePath = dynParameter.getShowFilePath();//项目路径 
	    	
	    	// 生成文件名同时创建不存在的目录
            String fileRealName = getRealFileName(fileName, localPath);
           
            // 创建文件
            File file = new File(localPath + "/" + fileRealName);
            
            try {
            	//写入
				cfile.getFileItem().write(file);
				
				//验证尺寸				
				if(checkSize!=null&&checkSize.equals("1")){
					message = checkSize(upType, width, height);
					if (CharsTool.isNotEmpty(message)) {			    		
		                return uploaderReturn(model, message);
		            }	 
				}
				//验证大小
				if(checkVolume!=null&&checkVolume.equals("1")){
					message = checkVolume(upType, volumeSize, volumeType);
					if (CharsTool.isNotEmpty(message)) {			    		
		                return uploaderReturn(model, message);
		            }
				}
				//反馈尺寸
				if(tickSize!=null&&tickSize.equals("1")){
					model = tickSize(upType, file, model);
					model.addAttribute("tickSize", tickSize);
				}
				//反馈大小
				if(tickVolume!=null&&tickVolume.equals("1")){
					model =tickVolume(upType, file, model);
					model.addAttribute("tickVolume", tickVolume);
				}
				
			} catch (Exception e) {	
				e.printStackTrace();
				uploaderReturn(model, "100错误：程序异常，请联系管理员！");				
			}            
            String url = showFilePath + fileRealName;//项目路径文件 
            
            //System.out.println("url: "+url);
            
            model.addAttribute("upId", upId);
            
            model.addAttribute("upType", upType);
            
	    	model.addAttribute("url", url.replace("\\\\", "/"));
	    }
		return uploaderReturn(model, message);
	}
	
	/**
	 * 
	 * @Description: 尺寸反馈
	 * @param upType
	 * @param file
	 * @param model
	 * @return   
	 * Model  
	 * @throws
	 * @author keyGuo
	 * @date 2016年8月30日 上午11:40:02
	 */
	private Model tickSize(String upType,File file,Model model){		
		if (upType.equals("picture")) {	//图片     	
			try {
				BufferedImage bi = javax.imageio.ImageIO.read(file);
				model.addAttribute("width", bi.getWidth());
		    	model.addAttribute("height", bi.getHeight());
			} catch (IOException e) {			
				e.printStackTrace();
			}	
        }else if (upType.equals("video")){//视频 
        	
        	
        	
        	
        }		
		return model;
	}
	
	/**
	 * 
	 * @Description: 反馈文件大小
	 * @param upType
	 * @param file
	 * @param model
	 * @return   
	 * Model  
	 * @throws
	 * @author keyGuo
	 * @date 2016年8月30日 上午11:42:03
	 */
	private Model tickVolume(String upType,File file,Model model){
		
		return model;
	}
	
	
	/**
	 * 
	 * @Description: 校验尺寸
	 * @param upType
	 * @param width
	 * @param height
	 * @return   
	 * String  
	 * @throws
	 * @author keyGuo
	 * @date 2016年8月30日 上午11:21:18
	 */
	private String checkSize(String upType,Long width,Long height){
		
		if(width==null||height==null||width.longValue()<=0||width.longValue()<=0){
			return "102程序错误，校验尺寸标准上传错误！";
		}
		
		
		if (upType.equals("picture")) {	        	
                   
        }
		
		if (upType.equals("video")){
        	
        } 
		
		return null;
	}
	
	/**
	 * 
	 * @Description: 校验大小 
	 * @param upType
	 * @param volumeSize
	 * @param volumeType
	 * @return   
	 * String  
	 * @throws
	 * @author keyGuo
	 * @date 2016年8月30日 上午11:29:48
	 */
	private String checkVolume(String upType,Long volumeSize,String volumeType){
		if(volumeSize==null||volumeSize.longValue()<=0){
			return "102程序错误，校验文件大小标准上传错误！";
		}
		String fileUnit = "KBMBGBTB";
		if(volumeType==null||fileUnit.indexOf(volumeType.toUpperCase())==-1){
			return "102程序错误，校验文件大小单位上传错误！";
		}
		
		if (upType.equals("picture")) {	        	
            
        }
		
		if (upType.equals("video")){
        	
        } 
		
		
		return null;
	}
	
	/**
	 * 
	 * @Description: 返回页面
	 * @param model
	 * @param message
	 * @return   
	 * String  
	 * @throws
	 * @author keyGuo
	 * @date 2016年8月29日 下午4:41:10
	 */
	private String uploaderReturn(Model model,String message){
		
		model.addAttribute("message", message);
		
		return "/plugin/uploader";
	}
	
	/**
	 * 
	 * @Description: 校验文件类型
	 * @param fileName
	 * @param upType
	 * @return   
	 * String  
	 * @throws
	 * @author keyGuo
	 * @date 2016年8月29日 下午4:45:52
	 */
	private String checkUpType(String fileName, String upType){
		
		 String[] fileNameArray = fileName.split("\\.");
		 if (fileNameArray.length < 2) {
	            return "上传文件类型错误，请重新选择文件上传";
	        }
		 
        String filesuffix = "."+fileNameArray[fileNameArray.length-1];
        
        if (upType.equals("picture")) {	        	
            if (!FilesUtil.checkPicType(filesuffix,null)) {
                return "上传文件不是图片类型，请重新选择文件上传!";
            }          
        }else if (upType.equals("video")){
        	if(!FilesUtil.checkVideoType(filesuffix, null)){
        		return "上传文件不符合视频类型要求，请重新选择文件上传!";
        	}
        } 
		
		return null;
	}
	
	/**
	 * 
	 * @Description: 生成不存在的日期目录
	 * @param fileName
	 * @param dir
	 * @return   
	 * String  
	 * @throws
	 * @author keyGuo
	 * @date 2016年8月29日 下午5:44:30
	 */
	private String getRealFileName(String fileName, String dir) {
		
        String[] fileNameArray = fileName.split("\\.");
        if (fileNameArray.length < 2) {
            return null;
        }
        return FilesUtil.generateFileName("."+fileNameArray[fileNameArray.length - 1],"uploader","/", dir, dir);
    }

}
